import axios from 'axios'
import { getToken, removeToken } from './cookie'
import router from '@/router';
import { ElMessage } from 'element-plus'

//不同的功能，通过axios请求的是不同接口的地址
//127.0.0.1:19090
axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";

const service = axios.create({
  baseURL:"/dev-api",
  //baseURL:"http://127.0.0.1:19090/system",
  timeout:5000,     //ms
})

//请求拦截器 拦截前端请求
service.interceptors.request.use(
  (config) => {
    //cookie提供的方法 
    if (getToken()) {
      config.headers["Authorization"] = "Bearer " + getToken();
    }
    return config;
  },
  (error) => {
    console.log(error)
    Promise.reject(error);
  }
);

//响应拦截器
service.interceptors.response.use(
  (res) => {  //res : 响应数据
    // 如果是流式响应，直接返回原始响应
    if (res.config.responseType === 'stream') {
      return res;
    }
    
    // 检查响应数据是否存在
    if (!res.data) {
      console.warn('响应数据为空:', res)
      return Promise.resolve({ data: null })
    }
    
    // 检查是否有code字段（标准响应格式）
    if (res.data.hasOwnProperty('code')) {
      const code = res.data.code;
      const msg = res.data.msg;
      
      console.log('响应code:', code, 'msg:', msg, 'data:', res.data.data)
      
      //捕捉到3001异常 跳转到登录页
      if (code === 3001) {
        ElMessage.error(msg);
        removeToken()
        return Promise.reject(new Error(msg));
      } else if (code !== 1000) { // 暂时保持200，稍后根据实际值调整
        console.log('code不等于1000，实际code值:', code)
        ElMessage.error(msg);
        return Promise.reject(new Error(msg));
      } else {
        return Promise.resolve(res.data);
      }
    } else {
      // 没有code字段，说明是直接返回的数据
      console.log('直接返回数据，包装成标准格式:', res.data)
      return Promise.resolve({
        code: 200,
        msg: '操作成功',
        data: res.data
      });
    }
  },
  (error) => {
    console.error('请求错误:', error)
    if (error.response) {
      // 服务器返回了错误状态码
      const status = error.response.status
      const message = error.response.data?.msg || `请求失败 (${status})`
      ElMessage.error(message)
    } else if (error.request) {
      // 请求已发出但没有收到响应
      ElMessage.error('网络错误，请检查网络连接')
    } else {
      // 其他错误
      ElMessage.error('请求配置错误')
    }
    return Promise.reject(error);
  }
);

export default service

//http://localhost:5173/dev-api/sysUser/login   出现跨域问题的原因 

//同源策略
// 同源策略指的就是，浏览器出于安全考虑，实施的一种策略，即只允许来自同一源（即协议+域名+端口都相同）的请求访问资源。否则就会导致致跨域问题。
// 例如 http://xxxx.com -> https://xxxx.com 存在跨域 协议不同   http://xxxx.com -> http://xxxx.com
// 例如 127.x.x.x:8001 -> 127.x.x.x:8002 存在跨域 端口不同
// 例如 www.xxxx.com -> www.yyyy.com 存在跨域 域名不同

//解决方案-代理服务器
//前端（浏览器） ---》  代理服务器  ——》  后端 